#include "Dri_TIM3.h"

/**
 * @brief TIM3初始化
 * 
 */
void Dri_TIM3_Init(void)
{
    // 1. 时钟使能 ----------------------------------
    // 1.1 对 GPIOB 时钟使能
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
    // 1.2 对 TIM3 时钟使能
    RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;

    // 2. GPIO 设置 --------------------------------
    // 设置 TIM3_CH3 (PB0) 为复用推挽输出, MODE=11; CNF=10
    GPIOB->CRL |= GPIO_CRL_MODE0; 
    GPIOB->CRL |= GPIO_CRL_CNF0_1;
    GPIOB->CRL &= ~GPIO_CRL_CNF0_0;

    // 3. TIM3 时基单元设置 -------------------------
    // 3.1 设置 CNT 计数模式为向上计数 （默认值，可以省略）
    TIM3->CR1 &= ~TIM_CR1_CMS;  // 关闭中央对齐模式
    TIM3->CR1 &= ~TIM_CR1_DIR;  // 设置为向上计数
    // 3.2 设置 PSC 预分频值，实现 10us 计 1 个数
    TIM3->PSC = 719;
    // 3.3 设置 ARR 自动重装载值，实现每隔 1ms 产生一次更新事件（计100个数）
    TIM3->ARR = 99;

    // 4. TIM3 输出比较单元设置 ---------------------
    // 4.1 设置通道3为输出模式(CCMR2.CC3S=00, 默认值)
    TIM3->CCMR2 &= ~TIM_CCMR2_CC3S;
    // 4.2 设置通道3的输出比较模式为 PWM 模式1（CCMR2.OC3M=110）
    TIM3->CCMR2 |= TIM_CCMR2_OC3M_2;
    TIM3->CCMR2 |= TIM_CCMR2_OC3M_1;
    TIM3->CCMR2 &= ~TIM_CCMR2_OC3M_0;
    // 4.3 设置通道3的输出极性：有效电平为高电平 （CCER.CC3P=0, 默认值）
    TIM3->CCER &= ~TIM_CCER_CC3P;
    // 4.4 设置通道3的输出使能（CCER.CC3E=1）
    TIM3->CCER |= TIM_CCER_CC3E;
}

/**
 * @brief TIM3启动
 * 
 */
void Dri_TIM3_Start(void)
{
    // TIM3 计数使能
    TIM3->CR1 |= TIM_CR1_CEN;
}

/**
 * @brief TIM3停止
 *
 */
void Dri_TIM3_Stop(void)
{
    // 停止 TIM3 计数使能
    TIM3->CR1 &= ~TIM_CR1_CEN;
}

/**
 * @brief 设置TIM3的通道3输出的PWM的占空比
 * 
 * @param duty 占空比的值，范围是 0~100，如果需要设置占空比50%，该参数就传入50
 */
void Dri_TIM3_SetDuty(uint8_t duty)
{
    // 检查 duty 的范围
    if (duty > 100) 
    {
        duty = 100; 
    }

    // 将 duty 赋值给 CCR3
    TIM3->CCR3 = duty;
}
